package cn.tedu.charging.user.service.impl;

import cn.tedu.charging.common.utils.JsonUtils;
import cn.tedu.charging.user.dao.repository.UserRepository;
import cn.tedu.charging.user.pojo.UserPO;
import cn.tedu.charging.user.pojo.WxLoginData;
import cn.tedu.charging.user.service.WxLoginService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
public class WxLoginServiceImpl implements WxLoginService {
    /**
     * appId 替换成你的appId ,应该放到配置文件里
     */
    private String appId = "wxf779b752305c868a";

    /**
     * 小程序密钥 替换成你的AppSecret  应该放到配置文件里
     */
    private String appSecret = "f836600fa122521e5d6b4e09d0b863c9";


    @Autowired
    private UserRepository userRepository;

    @Override
    public Integer login(String code, String nickName) {
        //调用微信API 获取code对应的 openId
        String openId = getOpenId(code);
        if (openId != null) {
            //通过openId 查询用户信息
            UserPO userPO = userRepository.getUserInfoByOpenId(openId);
            if (userPO == null) {
                //用户信息为空 表示用户第一次使用我们的系统，注册用户
                //把用户的openId和昵称保存到数据库中
                userPO = new UserPO();
                userPO.setWxOpenId(openId);
                userPO.setNickName(nickName);
                //返回注册成功后的用户id
                return userRepository.save(userPO);
            } else {
                //不为空，表示用户已经注册，不是第一次使用我们的系统，直接返回用户ID
                return userPO.getId();
            }
        }
        //登录失败
        return -1;
    }

    /**
     * 业务服务器通过code + 仅保存在服务器的appsecret参数，
     * 向：微信开放平台接口发起网络请求详情。
     *
     * @param code
     * @return
     */
    private String getOpenId(String code) {
        //通过微信的接口地址和appidAppID(小程序ID)和 appSecret AppSecret(小程序密钥)
        String url = "https://api.weixin.qq.com/sns/jscode2session?" +
                "appid=" + appId +
                "&secret=" + appSecret +
                "&js_code=" + code +
                "&grant_type=authorization_code";
        String jsonData = restTemplate.getForObject(url, String.class);
        WxLoginData wxLoginData = JsonUtils.fromJson(jsonData, WxLoginData.class);
        log.debug("微信返回的数据:{}", wxLoginData);
        if (wxLoginData != null) {
            return wxLoginData.getOpenid();
        }
        return null;
    }

    @Autowired
    private RestTemplate restTemplate;
}
